#ifndef RP2EFFECT_H
#define RP2EFFECT_H

#include "Rp2Object.h"

// aggregrate streaming
#include "Rp2ColorRGB.h"
#include "Rp2ColorRGBA.h"
/*#include "Rp2Matrix2.h"*/
#include "Rp2Matrix3.h"
#include "Rp2Matrix4.h"
#include "Rp2Plane3.h"
/*#include "Rp2Quaternion.h"*/
#include "Rp2Transformation.h"
#include "Rp2Vector2.h"
#include "Rp2Vector3.h"
#include "Rp2Vector4.h"

namespace Rp2
{

class Geometry;
class Renderer;
class Spatial;
class VisibleObject;

class Effect : public Object
{
	RP2_DECLARE_RTTI;
	RP2_DECLARE_NAME_ID;

public:
	// abstract base class
	virtual ~Effect();
	
    // Override this function to obtain whatever drawing behavior your effect
    // requires.  If this is not overridden, the default behavior is to
    // draw all the Geometry objects in akVisible.
    virtual void Draw (Renderer* pkRenderer, Spatial* pkGlobalObject,
        int iMin, int iMax, VisibleObject* akVisible);

    // Override these to allow loading and releasing of any resources your
    // effect requires.  The defaults are to do nothing.  The functions are
    // called by Renderer::LoadResources and Renderer::ReleaseResources for
    // Geometry and Effect objects.
    virtual void LoadResources (Renderer* pkRenderer, Geometry* pkGeometry);
    virtual void ReleaseResources (Renderer* pkRenderer,
        Geometry* pkGeometry);	

protected:
	Effect();

};

typedef Pointer<Effect> EffectPtr;

}

#endif